package com.tz.pay;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

import com.tz.pay.ali.core.config.AlipayConfig;
import com.tz.pay.ali.core.util.AlipaySubmit;
import com.tz.pay.weixin.core.common.ApiURL;
import com.tz.pay.weixin.core.common.Configure;
import com.tz.pay.weixin.core.utils.HttpUtil;
import com.tz.pay.weixin.core.utils.PayCommonUtil;
import com.tz.util.UUIDGenerator;
import com.tz.util.dom4jXMLUtil;

/**
 * 
 * PayParamUtil<BR>
 * 作者:Marlon  <BR>
 * 时间:2016年10月29日-下午3:02:00 <BR>
 * 邮箱:18093454447@163.com  <BR>
 * @version 1.0.0  <BR>
 * @link see:  <BR>
 */
public class PayParamUtil {

	public static final String ALI_NOTIFY_URL = "http://localhost:8080/create_direct_pay_by_user-JAVA-UTF-8/notify_url.jsp";// 服务器异步通知页面路径,这个不能够本地测试，必须一定要在外网的情况下才能测试成功...
	public static final String ALI_PAY_TYPE = "1";// 支付类型
	public static final String RESULT_URL = "http://localhost:8080/tzpay/wait.jsp";// 页面跳转同步通知页面路径
	public static final String EXTER_INVOKE_IP = "";//客户端ip
	
	/**
	 * ali支付工具类
	 * 方法名：goAliPay<BR>
	 * 时间：2016年10月30日-上午11:40:40 <BR>
	 * @param payBean
	 * @return String<BR>
	 * @exception <BR>
	 * @since  1.0.0
	 */
	public static String goAliPay(PayBean payBean){
		// //////////////////////////////////请求参数//////////////////////////////////////
		// 支付类型
		//String payment_type = ALI_PAY_TYPE;//1代表的即时到账
		// 必填，不能修改
		// 服务器异步通知页面路径,这个不能够本地测试，必须一定要在外网的情况下才能测试成功...
		//String notify_url = ALI_NOTIFY_URL;
		// 需http://格式的完整路径，不能加?id=123这类自定义参数
		// 页面跳转同步通知页面路径
		//String return_url = ALI_RESULT_URL;
		// 需http://格式的完整路径，不能加?id=123这类自定义参数，不能写成http://localhost/
		// 需以http://开头的完整路径，例如：http://www.商户网址.com/myorder.html
		// 防钓鱼时间戳
		String anti_phishing_key = "";
		// 若要使用请调用类文件submit中的query_timestamp函数
		// 客户端的IP地址
		//String exter_invoke_ip = "";
		// 非局域网的外网IP地址，如：221.0.0.1
		// ////////////////////////////////////////////////////////////////////////////////
		// 把请求参数打包成数组
		Map<String, String> sParaTemp = new HashMap<String, String>();
		sParaTemp.put("service", "create_direct_pay_by_user");
		sParaTemp.put("partner", AlipayConfig.partner);
		sParaTemp.put("seller_email", AlipayConfig.seller_email);
		sParaTemp.put("_input_charset", AlipayConfig.input_charset);
		sParaTemp.put("payment_type", ALI_PAY_TYPE);
		sParaTemp.put("notify_url", ALI_NOTIFY_URL);
		sParaTemp.put("return_url", RESULT_URL);
		sParaTemp.put("out_trade_no", payBean.getPno());
		sParaTemp.put("subject", payBean.getSubject());
		sParaTemp.put("total_fee", payBean.getMoney());
		sParaTemp.put("body", payBean.getDesc());
		sParaTemp.put("show_url", payBean.getDetailUrl());
		sParaTemp.put("anti_phishing_key", anti_phishing_key);
		sParaTemp.put("exter_invoke_ip", EXTER_INVOKE_IP);
		// 建立请求
		String sHtmlText = AlipaySubmit.buildRequest(sParaTemp, "get", "确认");
		return sHtmlText;
	}
	
	
	/**
	 * weixin支付工具类
	 * com.tz.pay 
	 * 方法名：goAliPay
	 * 创建人：xuchengfei 
	 * 手机号码:15074816437
	 * 时间：2016年2月29日-下午10:31:32 
	 * @param payBean
	 * @return 
	 * 返回类型：String
	 * @throws SAXException 
	 * @throws IOException 
	 * @throws ParserConfigurationException 
	 * @exception 
	 * @since  1.0.0
	 */
	public static String goWeixinPay(PayBean payBean){
		Map<Object,Object> sParaTemp = new HashMap<Object,Object>();
		//Map<String, String> sParaTemp = new HashMap<String, String>();
		sParaTemp.put("appid", Configure.getAppid());//应用ID 必填 String(32) wxd678efh567hg6787 微信开放平台审核通过的应用APPID
		sParaTemp.put("mch_id", Configure.getMchid());//商户号 必填 String(32) 1230000109 微信支付分配的商户号
		//随机数
	    sParaTemp.put("nonce_str", UUIDGenerator.getUUID());//随机字符串 必填 String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS
	    sParaTemp.put("body", payBean.getDesc());  //商品描述
	    sParaTemp.put("out_trade_no", payBean.getPno());   //订单号
	    sParaTemp.put("total_fee", String.valueOf(Float.valueOf(payBean.getMoney())*100));  //金额必须为整数  单位为分
	    sParaTemp.put("spbill_create_ip", EXTER_INVOKE_IP);   //本机的Ip
	    sParaTemp.put("trade_type", "NATIVE"); //交易类型
	    sParaTemp.put("product_id", "12235413214070356458058"); // 商户根据自己业务传递的参数 当trade_type=NATIVE时必填
	    sParaTemp.put("notify_url", RESULT_URL); //支付成功后，回调地址
        //根据微信签名规则，生成签名。随机参数可以在商户后台管理系统中进行设置。
        String sign = PayCommonUtil.createSign2("UTF-8", sParaTemp,Configure.getKey());  
        sParaTemp.put("sign", sign);
       // String requestXML = XMLUtil.map2XmlString(sParaTemp); 
        String requestXML = dom4jXMLUtil.getRequestXml(sParaTemp);
        System.out.println(requestXML);
        String resXml = HttpUtil.postData(ApiURL.unifiedorder, requestXML);
        System.out.println(resXml);
        Map<String, String> map = dom4jXMLUtil.readStringXmlOut(resXml);
        System.out.println(map.get("code_url"));
		return map.get("code_url")!=null?map.get("code_url").toString():"fail";
	}
	

}
